package com.example.chiro;

import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.List;

import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ByteArrayEntity;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicHeader;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.protocol.HTTP;
import org.json.JSONException;
import org.json.JSONObject;

import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.location.Address;
import android.location.Geocoder;
import android.net.Uri;
import android.os.AsyncTask;
import android.util.Base64;
import android.util.Log;
import android.widget.Toast;

public class HTTPSendData extends AsyncTask<Void, Long, Integer> {

	//variables nécessaire pour créer/ajouter la clé id+nom+prenom+date qui servira d'identifiant dans la base de données distante 
	String id = null ,nom = null ,prenom = null ,date = null;
	Cursor curseur_general = null;
	
	boolean envoi = true;
	
	// format ip : XX.XX.XX.XX:XXXX
	String ip = "92.158.254.163:9000";
	
	@Override
	protected Integer doInBackground(Void... arg) {
		
		try {
            
			Arbre.table_general.open();
			Arbre.table_arbre.open();
			Arbre.table_cavite.open();
			Arbre.table_espece.open();
			
			//int nombre_total_a_envoyer = Arbre.table_general.nombre_non_envoye()+Arbre.table_arbre.nombre_non_envoye()+Arbre.table_cavite.nombre_non_envoye()+Arbre.table_espece.nombre_non_envoye(); 
			int nombre_envoye = 0;
			//Log.i("Nombre de lignes à false (donc à envoyer)", String.valueOf(nombre_total_a_envoyer));
			
			curseur_general = Arbre.table_general.getAll();
			Cursor curseur_arbre = null;
			Cursor curseur_cavite = null;
			Cursor curseur_espece = null;
			JSONObject json_builder;

			if (curseur_general.moveToFirst()){
				while(!curseur_general.isAfterLast()){
					json_builder = new JSONObject();
					Geocoder geo = new Geocoder(Arbre.context);
					// lire chaque parametre
					
					id = String.valueOf(curseur_general.getPosition());
					
					for (int k = 0; k < curseur_general.getColumnCount(); k++) {
						if (curseur_general.getColumnName(k).compareTo("nom") == 0)
							nom = curseur_general.getString(k);
						if (curseur_general.getColumnName(k).compareTo("prenom") == 0)
							prenom = curseur_general.getString(k);
						if (curseur_general.getColumnName(k).compareTo("date") == 0)
							date = curseur_general.getString(k);
						if (curseur_general.getColumnName(k).compareTo("commune") == 0){
							geo = new Geocoder(Arbre.context);
							List<Address> addresses = geo.getFromLocation(Double.valueOf(curseur_general.getString(curseur_general.getColumnIndex("latitude"))), Double.valueOf(curseur_general.getString(curseur_general.getColumnIndex("longitude"))), 1);
							json_builder.put(curseur_general.getColumnName(k), String_operation.op_string(addresses.get(0).getLocality()));
						}
						else if(curseur_general.getColumnName(k).compareTo("lieu_dit") == 0){
							geo = new Geocoder(Arbre.context);
							List<Address> addresses = geo.getFromLocation(Double.valueOf(curseur_general.getString(curseur_general.getColumnIndex("latitude"))), Double.valueOf(curseur_general.getString(curseur_general.getColumnIndex("longitude"))), 1);
							json_builder.put(curseur_general.getColumnName(k), String_operation.op_string(addresses.get(0).getThoroughfare()));
						}else{
							json_builder.put(curseur_general.getColumnName(k), curseur_general.getString(k));
						}
					}
					json_builder.put("_id", curseur_general.getPosition());

					Log.i("curseur_general["+curseur_general.getPosition()+"] en BJSON",json_builder.toString());
					
					if (curseur_general.getString(curseur_general.getColumnIndex("envoye")).compareTo("true")==0){
						Log.i("curseur_general["+curseur_general.getPosition()+"] en JSON","déja envoyé !");
					}
					else{
						//Log.i("curseur_general["+curseur_general.getPosition()+"] en JSON","pas encore envoyé!");
						if (envoi)envoi_JSON(json_builder.toString(), ip, "general");
					}
					curseur_arbre = Arbre.table_arbre.getByID(curseur_general.getPosition()+1);
					if (curseur_arbre.moveToFirst()){
						while(!curseur_arbre.isAfterLast()){
							json_builder = new JSONObject();
							byte[] b = null;
							for (int k = 0; k < curseur_arbre.getColumnCount(); k++) {

								if (curseur_arbre.getColumnName(k).compareTo("path_photo") == 0) {
									if (curseur_arbre.getString(k).compareTo("NC")!=0){
										Bitmap photo_bitmap = BitmapFactory.decodeFile(curseur_arbre.getString(k));
										ByteArrayOutputStream stream = new ByteArrayOutputStream();
										photo_bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
										photo_bitmap.recycle();
										b = stream.toByteArray();
										//Log.i("stream image", String.valueOf(b.length));
										continue;
									}
								}
								json_builder.put(curseur_arbre.getColumnName(k), curseur_arbre.getString(k));
							}
							json_builder.put("id_observateur", id+"-"+nom+"-"+prenom+"-"+date);
							
							Log.i("curseur_arbre["+curseur_arbre.getPosition()+"] en BJSON",json_builder.toString());
							
							if (curseur_arbre.getString(curseur_arbre.getColumnIndex("envoye")).compareTo("true")==0){
								Log.i("curseur_arbre["+curseur_arbre.getPosition()+"] en JSON","déja envoyé !");
							}
							else{
								//Log.i("curseur_arbre["+curseur_arbre.getPosition()+"] en JSON","pas encore envoyé");
									
								if (envoi) {
									int id = envoi_JSON(json_builder.toString(), ip, "arbre");
									
									
									if (curseur_arbre.getString(curseur_arbre.getColumnIndex("path_photo")).length()>0 && curseur_arbre.getString(curseur_arbre.getColumnIndex("path_photo")).compareTo("NC")!=0){
										//Log.i("ENVOI PHOTO", "avant");
										envoi_PHOTO(b, ip, "arbrephoto", id);
										//Log.i("ENVOI PHOTO", "après");
									}
								}

							}
							
							//Log.i("Arbre : ", "envoyé ! (fin de boucle)");
							
							
							Log.i("Arbre.table_arbre.update_envoi(curseur_general.getPosition()+1, \"true\");",String.valueOf(Arbre.table_arbre.update_envoi(curseur_general.getPosition()+1, "true")));
							curseur_arbre.moveToNext();
						}
					}
					
					curseur_cavite = Arbre.table_cavite.getByID(curseur_general.getPosition()+1);
					if (curseur_cavite.moveToFirst()){
						while(!curseur_cavite.isAfterLast()){
							json_builder = new JSONObject();
							byte[] b = null;
							for (int k = 0; k < curseur_cavite.getColumnCount(); k++) {

								if (curseur_cavite.getColumnName(k).compareTo("path_photo") == 0) {
									if (curseur_cavite.getString(k).compareTo("NC")!=0){
										Bitmap photo_bitmap = BitmapFactory.decodeFile(curseur_cavite.getString(k));
										ByteArrayOutputStream stream = new ByteArrayOutputStream();
										photo_bitmap.compress(Bitmap.CompressFormat.JPEG, 50, stream);
										photo_bitmap.recycle();
										b = stream.toByteArray();
										//Log.i("stream image", String.valueOf(b.length));
										continue;
									}
								}
								if (curseur_cavite.getColumnName(k).compareTo("id_fiche") == 0) continue;
								json_builder.put(curseur_cavite.getColumnName(k), curseur_cavite.getString(k));
							}
							json_builder.put("id_observateur", id+"-"+nom+"-"+prenom+"-"+date);
							
							Log.i("curseur_cavite["+curseur_cavite.getPosition()+"] en BJSON",json_builder.toString());
							
							
							if (curseur_cavite.getString(curseur_cavite.getColumnIndex("envoye")).compareTo("true")==0){
								Log.i("curseur_cavite["+curseur_cavite.getPosition()+"] en JSON","déja envoyé !");
							}
							else{
								if (envoi){
								//Log.i("curseur_cavite["+curseur_cavite.getPosition()+"] en JSON","pas encore envoyé");
									int id = envoi_JSON(json_builder.toString(), ip, "cavite");
								/*
								Log.i("ENVOI PHOTO", "avant");
								if (curseur_cavite.getString(curseur_cavite.getColumnIndex("path_photo")).length()>0)
									envoi_PHOTO(b, ip, "arbrephoto", id);
								Log.i("ENVOI PHOTO", "après");
								*/
								}
							}
							
							//Log.i("Cavite : ", "envoyé ! (fin de boucle)");
							Log.i("DEBUG",curseur_cavite.getString(curseur_cavite.getColumnIndex("_id")));
							
							Log.i("Arbre.table_cavite.update_envoi(curseur_general.getPosition()+1, \"true\");",String.valueOf(Arbre.table_cavite.update_envoi(Integer.parseInt(curseur_cavite.getString(curseur_cavite.getColumnIndex("_id"))), "true")));
							curseur_cavite.moveToNext();
						}
					}
					
					curseur_espece = Arbre.table_espece.getByID(curseur_general.getPosition()+1);
					if (curseur_espece.moveToFirst()){
						while(!curseur_espece.isAfterLast()){
							json_builder = new JSONObject();
							byte[] b = null;
							for (int k = 0; k < curseur_espece.getColumnCount(); k++) {

								if (curseur_espece.getColumnName(k).compareTo("path_photo") == 0) {
									if (curseur_espece.getString(k).compareTo("NC")!=0){
										Bitmap photo_bitmap = BitmapFactory.decodeFile(curseur_espece.getString(k));
										ByteArrayOutputStream stream = new ByteArrayOutputStream();
										photo_bitmap.compress(Bitmap.CompressFormat.JPEG, 50, stream);
										photo_bitmap.recycle();
										b = stream.toByteArray();
										//Log.i("stream image", String.valueOf(b.length));
										continue;
									}
								}
								if (curseur_espece.getColumnName(k).compareTo("id_fiche") == 0) continue;
								
								json_builder.put(curseur_espece.getColumnName(k), curseur_espece.getString(k));
								Log.i("TEST ESPECE", curseur_espece.getColumnName(k));
							}
							json_builder.put("id_observateur", id+"-"+nom+"-"+prenom+"-"+date);
							
							Log.i("curseur_espece["+curseur_espece.getPosition()+"] en BJSON",json_builder.toString());
							
							
							if (curseur_espece.getString(curseur_espece.getColumnIndex("envoye")).compareTo("true")==0){
								Log.i("curseur_espece["+curseur_espece.getPosition()+"] en JSON","déja envoyé !");
							}
							else{
								//Log.i("curseur_espece["+curseur_espece.getPosition()+"] en JSON","pas encore envoyé");
								if (envoi){
									int id = envoi_JSON(json_builder.toString(), ip, "espece");
								/*
								Log.i("ENVOI PHOTO", "avant");
								if (curseur_espece.getString(curseur_espece.getColumnIndex("path_photo")).length()>0)
									envoi_PHOTO(b, ip, "arbrephoto", id);
								Log.i("ENVOI PHOTO", "après");
								*/
								}
							}
							
							//Log.i("Cavite : ", "envoyé ! (fin de boucle)");
							//Log.i("Arbre.table_espece.update_envoi(curseur_general.getPosition()+1, \"true\");",String.valueOf(Arbre.table_espece.update_envoi(curseur_general.getPosition()+1, "true")));
							
							Log.i("Arbre.table_cavite.update_envoi(curseur_general.getPosition()+1, \"true\");",String.valueOf(Arbre.table_espece.update_envoi(Integer.parseInt(curseur_espece.getString(curseur_espece.getColumnIndex("_id"))), "true")));
							curseur_espece.moveToNext();
						}
					}
					
					
					
					
					//Log.i("General : ", "envoyé ! (fin de boucle)");
					
					Log.i("Arbre.table_general.update_envoi(curseur_general.getPosition()+1, \"true\")", String.valueOf(Arbre.table_general.update_envoi(curseur_general.getPosition()+1, "true")));
					curseur_general.moveToNext();
					
				}
			}
			
			Arbre.table_general.close();
			Arbre.table_arbre.close();
			Arbre.table_cavite.close();
			Arbre.table_espece.close();
            
		} catch (Exception e) {
			e.printStackTrace();
			return 2;
		}
		return 0;
	}

	@Override
	public void onPreExecute() {
		Toast.makeText(Arbre.context, "traitement en cours...",
				Toast.LENGTH_SHORT).show();
	}

	@Override
	public void onProgressUpdate(Long... v) {

	}

	@Override
	public void onPostExecute(Integer a) {
		Toast.makeText(Arbre.context, "traitement terminé !", Toast.LENGTH_LONG)
				.show();
	}

	public String BitMapToString(Bitmap bitmap) throws IOException {
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		bitmap.compress(Bitmap.CompressFormat.JPEG, 50, baos);
		bitmap.recycle();
		byte[] b = baos.toByteArray();
		baos.close();
		baos = null;
		String temp = Base64.encodeToString(b, Base64.DEFAULT);
		return temp;
	}
	
	public int envoi_JSON(String json,String ip_server, String uri) throws ClientProtocolException, IOException{
		HttpClient client = new DefaultHttpClient();
        HttpConnectionParams.setConnectionTimeout(client.getParams(), 10000000); //Timeout Limit
		
		StringEntity se = new StringEntity(json);  
        se.setContentType(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
        String url = "http://"+ip_server+"/"+uri+"";
        Uri.Builder a = new Uri.Builder();
        a.path(url);
        String b = Uri.decode(a.build().toString());
        //Log.i("url construite",a.build().toString());
        //Log.i("url construite decode",b);
        HttpPost post = new HttpPost(b);
        post.setEntity(se);
        HttpResponse reponse = client.execute(post);
        if(reponse!=null){
            InputStream in = reponse.getEntity().getContent(); //Get the data in the entity
            BufferedReader reader = new BufferedReader(new InputStreamReader(in));
            StringBuilder sb = new StringBuilder();

            String line = null;
            try {
                while ((line = reader.readLine()) != null) {
                    sb.append((line + "\n"));
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            //Log.i("sb", sb.toString());	//sb format : "nom_de_type"/"retour", exemple : "arbre/true", "general/false"...
            String retour = sb.toString();
            if (retour.split("/")[1].compareTo("false") == 0){
            	//Log.e("Données non reçu !! ", "faux!!");
            	return -1;
            }
            if (retour.split("/")[1].compareTo("true") == 0){
            	//Log.i("réponse serveur", "Envoi photo OK !");
            	//Log.i("valeur réponse totale",retour);
            	//Log.i("valeur réponse totale split 2",retour.split("/")[2]);
            	int valeur = Integer.parseInt(retour.split("/")[2].replaceAll("[^0-9.]", ""));
            	Log.i("réponse serveur","photo id : "+valeur);
            	return valeur;
            }
            Log.i("retour valeur !!!!!!!", retour);
            /*
            if (retour.split("/")[0].compareTo("photo") == 0){
            	Bitmap plop;
            	plop.
            }*/
            
        }
		return -1;
	}
	
	public void envoi_PHOTO(byte[] byte_photo, String ip_server, String uri, int id) throws ClientProtocolException, IOException{
		HttpClient client = new DefaultHttpClient();
        HttpConnectionParams.setConnectionTimeout(client.getParams(), 10000000); //Timeout Limit
		
		//StringEntity se = new StringEntity(json);  
        //se.setContentType(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
        
        String url = "http://"+ip_server+"/"+uri+"/"+id;
        //String url = "http://"+ip_server+"/"+uri;
        Log.i("url", url);
        Log.i("byte", String.valueOf(byte_photo.length));
        Uri.Builder a = new Uri.Builder();
        a.path(url);
        String b = Uri.decode(a.build().toString());
        //Log.i("url construite",a.build().toString());
        //Log.i("url construite decode",b);
        HttpPost post = new HttpPost(b);
        
        
        
        post.setEntity(new ByteArrayEntity(byte_photo));
        HttpResponse reponse = client.execute(post);
	}
	
	
	
	
	//Si general : créé la clé unique qui identifie les rows des autres tables sur la base distante.
	public JSONObject cursorToJson(Cursor c, boolean general, boolean ajout_cle) throws JSONException{
		JSONObject resultat = new JSONObject();
		
		for (int k = 0; k < c.getColumnCount(); k++) {
			if (c.getColumnName(k).compareTo("nom") == 0 && general)
				nom = c.getString(k);
			if (c.getColumnName(k).compareTo("prenom") == 0 && general)
				prenom = c.getString(k);
			if (c.getColumnName(k).compareTo("date") == 0 && general)
				date = c.getString(k);
			//json += "\"" + curseur_general.getColumnName(k) + "\":\""+ curseur_general.getString(k) + "\",";
			if (c.getColumnName(k).compareTo("path_photo")!=0)
				resultat.put(c.getColumnName(k), c.getString(k));
			else
			{}
		}
		//json += "\"_id\":\""+id+"\"";
		if (general)
			resultat.put("_id", curseur_general.getPosition());
		if (ajout_cle)
			resultat.put("id_observateur",id+"-"+nom+"-"+prenom+"-"+date);
		
		return resultat;
		
	}

}
